package com.study.builder;

/**
 * 建造者模式
 * 一般适用于 不可变复杂对象的创建
 * 又或者属性跟属性之间有依赖关系有先后关系, 比如必须先有A才能有B等 传统的set方法也能处理 但是这种会更直白
 * 可以轻松的实现链式的同时还能很好的把控各个属性之间的先后依赖关系
 * lombok中给我们提供了 @builder注解来实现 建造者模式来构建实体类
 */
public class BuilderTest {
    public static void main(String[] args) {
        Product product = new Product.Builder().setPart1("xxx").setPart2("xxxx").setPart3("xxxx").setPart4("xxx").build();
        System.out.println(product);
    }
}


class Product{

    private final String part1 ;
    private final String part2 ;
    private final String part3 ;
    private final String part4 ;
    //.....假如还有很多其他的属性

    private Product(String part1,String part2,String part3,String part4){
        this.part1= part1;
        this.part2= part2;
        this.part3= part3;
        this.part4= part4;
    }

    @Override
    public String toString() {
        return "Product{" +
                "part1='" + part1 + '\'' +
                ", part2='" + part2 + '\'' +
                ", part3='" + part3 + '\'' +
                ", part4='" + part4 + '\'' +
                '}';
    }

    static class Builder{

        private String part1 ;
        private String part2 ;
        private String part3 ;
        private String part4 ;
        //.....假如还有很多其他的属性

        //返回this可以直接链式编程
        public Builder setPart1(String part1){
            this.part1 = part1;
            return this;
        }
        public Builder setPart2(String part2){
            this.part2 = part2;
            return this;
        }
        public Builder setPart3(String part3){
            this.part3 = part3;
            return this;
        }
        public Builder setPart4(String part4){
            this.part4 = part4;
            return this;
        }

        Product build(){
            //可以在这里对属性做校验
            return new Product(this.part1,this.part2, this.part3,this.part4);
        }

    }



}